package 工厂模式;

import java.util.HashMap;
import java.util.Map;

/**
 * 工厂模式: Java 中最常用的设计模式之一
 * 这种类型的设计模式属于创建型模式，它提供了一种创建对象的最佳方式
 * 在工厂模式中，我们在创建对象时不会对客户端暴露创建逻辑，并且是通过使用一个共同的接口来指向新创建的对象
 */
public class Test {

    public static void main(String[] args) {
        Dog dog = 工厂模式测试("red");
        dog.everyDay();

        dog = 工厂模式测试("blank");
        dog.everyDay();
    }

    public static Dog 工厂模式测试(String dogType) {
        // 原始版本
        // if ("red".equals(dogType)) {
        //     return new LittleDog();
        // } else if ("blank".equals(dogType)) {
        //     return new BlankDog();
        // } else if ("yellow".equals(dogType)) {
        //     return new YellowDog();
        // } else {
        //     return null;
        // }
        // else if ....
        // else ...

        // 工厂设计模式解决大量if else
        return DogFactory.getInstance(dogType);
    }

    public static class DogFactory {

        private static final Map<String, Dog> MAP = new HashMap<String, Dog>();

        private DogFactory() {
        }

        static {
            MAP.put("red", new RedDog());
            MAP.put("blank", new BlankDog());
            MAP.put("yellow", new YellowDog());
        }

        public static Dog getInstance(String dogType) {
            return MAP.get(dogType);
        }
    }
}
